package my.map;

/**
 * <p>
 * 映射
 * </p>
 *
 * @author AJun
 * @since 2020/8/31
 */
@SuppressWarnings("unused")
public interface Map<K, V> {

    /**
     * 获取Map的大小
     *
     * @return 映射的大小
     */
    int size();

    /**
     * 判断Map是否为空
     *
     * @return true: 空; false: 非空
     */
    boolean isEmpty();

    /**
     * 清空Map
     */
    void clear();

    /**
     * 给Map中添加键值对
     *
     * @param key   键
     * @param value 值
     * @return 如果添加相同的Key，则覆盖之前的Value，此处也返回之前的Value
     */
    V put(K key, V value);

    /**
     * 获取Map中指定key的值
     *
     * @param key Key
     * @return 指定的Key对应的值
     */
    V get(K key);

    /**
     * 删除Map中指定key的值
     *
     * @param key Key
     * @return 被删除的Key对应的值
     */
    V remove(K key);

    /**
     * 判断Map中是否包含指定的Key
     *
     * @param key Key
     * @return true: 包含; false: 不包含
     */
    boolean containsKey(K key);

    /**
     * 判断Map中是否包含指定的Value
     *
     * @param value Value
     * @return true: 包含; false: 不包含
     */
    boolean containsValue(V value);

    /**
     * 遍历Map
     *
     * @param visitor 遍历接口
     */
    void traversal(Visitor<K, V> visitor);

    /**
     * 提供给外界的遍历接口
     */
    @SuppressWarnings("UnusedReturnValue")
    abstract class Visitor<K, V> {
        boolean stop;

        public abstract boolean visit(K key, V value);
    }

}
